独習PHP:第5章 関数
独習PHP:第5章 関数
PHPの関数
最初から多く用意されていて、直感的に記述ができる
ソートなどの仕組みにとらわれる必要なく、関数の組み合わせや順番をコーディネートするのが大事
ifやforeachなどは制御命令であり、関数とはまた別
ビルトイン関数
内部関数、組み込み関数
PHPが標準で提供する関数。準備不要で使える関数、php.iniなどで設定を必要とするものなどもある
対義語はユーザー定義関数
文字列関数
mb_strlen($str): $strのマルチバイト文字(日本語)の長さを測る
explode(',', $data): 特定の区切り文字で配列とする
trim系
文字列前後の空白を削除できる。explodeと使えば結構良さそう
タブ文字、改行文字、NULLバイト、垂直タブを削除する
printf("%sは%sです。", "ハムちゃん", "動物");
変換指定子と呼ばれるプレイスホルダーを埋め込める
自由に変更できる引数のことを可変長引数と呼ぶ
%s以外にもたくさんあるので、使いたい時に調べる
mb_convert_kana
カナ表記が欲しい時に揺らぎがあった場合でも整えることができる
mb_send_mail関数
件名や本文にマルチバイト文字を送信するための関数
sendmailというシステムが必要。dockerコンテナには当然入っていないので入れないと使えない
postfixを入れた
apt install -y postfix
code:terminal
echo Hello | sendmail -f skonishi1125@gmail.com skonishi1125@gmail.com
postdrop: warning: unable to look up public/pickup: No such file or directory
postfixが動いてないだけ
service postfix restart
service postfix status // 確認
動かん、もっと入れる
これもやった
service sendmail statusしてstartした
echo Hello | sendmail skonishi1125@gmail.com skonishi1125@gmail.com
無理だ...
配列関数
配列に対して要素を操作する関数がほとんど
スタック
LIFO: Last In First Out(後入れ先出し)と呼ばれるもの
乗用車を乗り継ぐためのトラックのイメージ。最後に入れた車が最初に出ていく
○○○ ← ●(最初に出ていくのは、この最後に入れた黒丸)
phpならば、array_pushで追加してarray_popで吐き出すイメージで実装できる
キュー
FIFO: First In First Outと呼ばれるもの。
レジ打ちの順番のようなイメージ
phpならば、array_pushで追加してarray_shiftで吐き出せば実装できる
ソート色々
sort, rsort: キーを振り分け直してソートするので連想配列には不向き。
asort, ksort, krsortがおすすめ
usort
自作ルールを作って配列を並べ替える
code:php
// 単位を照準で用意
// ソート対象
// usort(対象, クロージャ )
usort($data, function($a, $b) use ($keys) {
// 左辺が右辺より小さいなら-1, 等しいなら0, 左辺が右辺より大きいなら1を返す
// $a , $bをキーに、$keysを検索し、登場位置で大小を比較している
return array_search($a, $keys) <=> array_search($b, $keys);
});
print_r($data);
// Array ( 0 => 火 1 => 木 2 => 土 3 => 日 ) クロージャのuse命令について
usortのソートの仕組みが知りたければ、クイックソートを学ぼうということ
callableとして定義されている無名関数の詳細については以下を参照する
関数で使われている引数の由来
$haystack: 検索対象の文字列
$needle: 検索文字列
a needle in a haystack: 干草の中の1本の針
haystackの中からneedleを探すので、このような言い回しになっている
P213 5.4 正規表現(PCRE)関数
PCRE(Perl Compatible Regular Expressions)
PCアプリケーションに実装されている、正規表現のライブラリ
PCREという規格が存在し、それに準拠した書き方をすることで正規表現を実現できる
正規表現は知りたくなったらこのメモを見返せば良い
5.5 ファイルシステム関数
ファイルの操作(読み書き等)を実現する関数
アクセスログを記述してみる
code:php
$data[] = date('Y/m/d H:i:s'); // アクセス日時
$data[] = $_SERVER'SCRIPT_NAME'; // アクセスしたスクリプトのパス (アクセスしたURLのこと) $data[] = $_SERVER'HTTP_REFERER'; // リンク元アドレス。お気に入りタブなどから遷移した場合は存在しないことがある // @: エラー演算子(出なくする)
// ファイルを開きなさい、or(さもなくば)スクリプトを終了しなさいという記入
$file = @fopen('access.log', 'a') or die('ファイルをひらけませんでした');
flock($file, LOCK_EX);
fwrite($file, implode("\t", $data) . "\n");
flock($file, LOCK_UN);
fclose($file);
print 'アクセスログを記録しました。';
fopen / fclose
テキストファイルを「開き」、記入後に「閉じる」関数
fopen ('name', 'a')
書込専用モード。ファイルが存在しないのであれば新規作成して行う
wは同じく書き込みだが、ファイル内容をクリアして書き込んでいく形になる
aは書き込み(過去のものに追加して)という違い
その他のモードはP239やドキュメントの参照
fclose
読み書きを終えた後、ファイルをクローズする
スクリプト終了時に自動で閉じられるが、記入することで明示的になる
バイナリモードとテキストモード
ファイルを扱うことになったとき、改行文字に気を使う必要がある
テキストモードでは\nは、\r\nに変換して読み書きする
基本バイナリモード(返還を行わないモード)で扱おう
die関数の使い所
ファイル処理と一緒に使われることが多い
ファイルがない、アクセス権限がないなどファイルを扱う処理はエラーではない「警告」が頻出する
なので@演算子で警告を発生させない
一緒にdie関数を定義しておく
指定されたメッセージを出力して、スクリプトを強制終了させるための関数
fwrite関数
エイリアスとしてfputs関数がある。どっちでもOK
code:php
// 日時やパス、クライアントの種類などをタブ区切りで連結して書き込みしている。最後は改行
fwrite($file, implode("\t", $data) . "\n");
ファイルのロック
flock関数
ファイルが別ユーザー同士で同時に処理されることを防ぐ役割がある
code:php
flock($file, LOCK_EX); // 排他ロックの設定。書込みするから他者の読み書き禁止!
fwrite($file, implode("\t", $data) . "\n");
flock($file, LOCK_UN); // ロック解除
そのほかのロックもある(LOCK_SH, LOCK_NB)
長時間のロックは全体のパフォーマンス低下にもつながるので、なるべく早く解除する
テキストを読み込もう
fgetcsv()
定型テキストを読み込む時に便利な関数
名前とは違って、csvの処理に特化した関数というわけではないので気を付ける
code:php
$file = fopen('access.log', 'r');
flock($file, LOCK_SH);
// ファイルハンドル(ファイルの指定), 読込む最大長, 区切り文字
// ファイルポインタをずれるので、それをwhileで処理している(ファイルの1行目→2行目...)
// 次の行がなければ(最後の行ならば)、fgetcsvがfalseを返してくれて止まる
while ($line = fgetcsv($file, 1024, "\t")) {
print '<tr>';
foreach ($line as $value) {
print '<td>' . $value . '</td>';
}
print '<\tr>';
}
flock($file, LOCK_UN);
fclose($file);
fgets()
指定されたファイルから1行分のデータを読み込む
code:php
$file = fopen('access.log', 'r');
flock($file, LOCK_SH);
$x = fgets($file, 1024);
var_dump($x);
flock($file, LOCK_UN);
fclose($file);
-------
// fgetcsvのように、データが配列で分割されず1行で返ってくる
string(158) "2022/12/13 22:00:01 /5_chapter/5_5.php Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 "
file関数
指定されたファイルをまとめて読み込んで、行単位で格納する
メモリ消費が大きいのであまり多用すべきではないので、fgetcsv関数などを使えるなら使う
ファイル内容を文字列としてまとめたいなら、file_get_contentsがいい
ファイルシステム関数の設定パラメーター
ファイルシステムに関わるパラメーターがphp.iniにいくつか存在する
ファイル操作ができない場合は弄ってみると良い
5.6 その他の関数
数学関数とか、unset関数とか、データ型を調べるための関数
unset関数: 変数を破棄するための変数